import random

class Student:
    # 属性
    id = 0
    name = ''
    age = 0
    # 构造函数
    # 默认情况下，Python类只有一个构造函数
    # 可通过使用@classmethod装饰器和类方法实现多个构造函数
    def __init__(self) -> None:
        self.__privateProperty = random.randint(1000000, 99999999) # 私有属性
        pass #pass 不做任何事情，一般用做占位语句。

    # def __init__(self, name, age):
    #     self.name = name
    #     self.age = age

    # 普通方法，需要self来表示自身
    # self是一个约定俗成的命名约定，用于指代实例方法的第一个参数。当定义一个实例方法时，self是必须的，而且必须位于其他参数之前
    def sayHello(self):
        print(self.name + ": hello !")

    # 私有方法
    def __privateMethod(self):
        print("执行了私有方法")

    # @classmethod不需要self来表示自身了，而是用了cls来代替
    @classmethod
    def fromClassNameAge(cls, name, age):
        s = Student()
        s.name = name
        s.age = age
        s.id = 0 #random.randint(1000000, 99999999)
        return s
    
    # @staticmethod 静态方法不需要表示自身对象的self或者cls作为参数
    @staticmethod
    def fromDbRow(id, name, age):
        s = Student()
        s.id = id
        s.name = name
        s.age = age
        return s


    
    